home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 626-637 / disk_636 / henon / henon.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  6KB  |  237 lines

  1. /*  Hénon v1.10
  2.  *  A program for drawing Hénon pictures.
  3.  *  Written by Stefan Zeiger in May '91
  4.  *  Updated 2/1992
  5.  *  © 1992 by ! Wizard Works !
  6.  *  Compiler : SAS/C 5.10
  7. */
  8.  
  9.  
  10. #include <exec/types.h>
  11. #include <graphics/gfxbase.h>
  12. #include <graphics/gfx.h>
  13. #include <intuition/intuitionbase.h>
  14. #include <intuition/intuition.h>
  15. #include <proto/intuition.h>
  16. #include <proto/graphics.h>
  17. #include <math.h>
  18.  
  19.  
  20. int CXBRK(void) { return(0); }    /* Disable Lattice CTRL-C handling */
  21. int chkabort(void) { return(0); } /* really */
  22.  
  23.  
  24. #define SIZE (80.0)
  25. #define XSIZE (160.0)
  26.  
  27.  
  28. struct IntuitionBase *IntuitionBase;
  29. struct GfxBase *GfxBase=NULL;
  30.  
  31.  
  32. struct Screen *my_screen=NULL;
  33. struct NewScreen my_new_screen=
  34. {
  35.   0,               /* LeftEdge  */
  36.   0,               /* TopEdge   */
  37.   640,             /* Width     */
  38.   200,             /* Height    */
  39.   2,               /* Depth     */
  40.   0,               /* DetailPen */
  41.   1,               /* BlockPen  */
  42.   HIRES,           /* ViewModes */
  43.   CUSTOMSCREEN,    /* Type      */
  44.   NULL,            /* Font      */
  45.   "Hénon v1.00",   /* Title     */
  46.   NULL,            /* Gadget    */
  47.   NULL             /* BitMap    */
  48. };
  49.  
  50.  
  51. struct Window *my_window=NULL;
  52. struct NewWindow my_new_window=
  53. {
  54.   0,             /* LeftEdge    */
  55.   11,            /* TopEdge     */
  56.   640,           /* Width       */
  57.   189,           /* Height      */
  58.   0,             /* DetailPen   */
  59.   1,             /* BlockPen    */
  60.   CLOSEWINDOW,   /* IDCMPFlags  */
  61.                  /*             */
  62.   SMART_REFRESH| /* Flags       */
  63.   WINDOWCLOSE|   /*             */
  64.   ACTIVATE,      /*             */
  65.   NULL,          /* FirstGadget */
  66.   NULL,          /* CheckMark   */
  67.   "The Hénon picture :",
  68.   NULL,          /* Screen      */
  69.   NULL,          /* BitMap      */
  70.   NULL,          /* MinWidth    */
  71.   NULL,          /* MinHeight   */
  72.   NULL,          /* MaxWidth    */
  73.   NULL,          /* MaxHeight   */
  74.   CUSTOMSCREEN   /* Type        */
  75. };
  76.  
  77.  
  78. struct TextAttr my_font=
  79. {
  80.   "topaz.font",TOPAZ_EIGHTY,NULL,FPF_ROMFONT
  81. };
  82.  
  83. struct IntuiText black_text=
  84. {
  85.   1,0,JAM2,
  86.   0,0,
  87.   &my_font,
  88.   NULL, /* Text */
  89.   NULL
  90. };
  91.  
  92.  
  93. void cleanexit(void);
  94.  
  95.  
  96. void main(int argc,char **argv)
  97. {
  98.   unsigned char buf[20];
  99.   double xx,x,y,xa,a,xymin,xymax,xystep,cosinus,sinus,precalc;
  100.   ULONG i,class,itera;
  101.   BOOL close_me=FALSE;
  102.   struct IntuiMessage *my_message;
  103.   BOOL os2=TRUE;
  104.   UWORD PenData[]={~0};
  105.  
  106.   /****** INTERPRET ARGUMENTS ******/
  107.  
  108.   if(strcmp(argv[1],"?")==0)
  109.   {
  110.     Write(Output(),"Hénon v1.00 by ! WIZARD WORKS !\nUsage : ",40);
  111.     Write(Output(),argv[0],strlen(argv[0]));
  112.     Write(Output()," <a> <xymin> <xymax> <xystep> <itera>\n",38);
  113.     cleanexit();
  114.   }
  115.  
  116.   if(argc!=6)
  117.   {
  118.     puts("Bad args.");
  119.     cleanexit();
  120.   }
  121.  
  122.   sscanf(argv[1],"%lf",&a);
  123.   sscanf(argv[2],"%lf",&xymin);
  124.   sscanf(argv[3],"%lf",&xymax);
  125.   sscanf(argv[4],"%lf",&xystep);
  126.   sscanf(argv[5],"%ld",&itera);
  127.  
  128.   /****** PREPARE EVERYTHING ******/
  129.  
  130.   IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",37);
  131.   if(IntuitionBase==NULL)
  132.   {
  133.     IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
  134.     os2=FALSE;
  135.     if(IntuitionBase==NULL)
  136.     {
  137.       puts("Can't open Intuition !");
  138.       cleanexit();
  139.     }
  140.   }
  141.  
  142.   GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);
  143.   if(GfxBase==NULL)
  144.   {
  145.     puts("Can't open Graphics !");
  146.     cleanexit();
  147.   }
  148.  
  149.   if(os2) my_screen=(struct Screen*) OpenScreenTags(&my_new_screen,SA_Pens,PenData,TAG_DONE,0);
  150.   else my_screen=(struct Screen*) OpenScreen(&my_new_screen);
  151.   if(my_screen==NULL)
  152.   {
  153.     puts("Can't open Screen");
  154.     cleanexit();
  155.   }
  156.  
  157.   my_new_window.Screen=my_screen;
  158.   my_window=(struct Window *) OpenWindow(&my_new_window);
  159.   if(my_window==NULL)
  160.   {
  161.     puts("Can't open Window");
  162.     cleanexit();
  163.   }
  164.  
  165.   SetAPen(my_window->RPort,1);
  166.   black_text.IText=buf;
  167.  
  168.   cosinus=cos(a);
  169.   sinus=sin(a);
  170.  
  171.   /****** DRAW PICTURE ******/
  172.  
  173.   for(xa=xymin;xa<=xymax;xa+=xystep)
  174.   {
  175.     x=xa;
  176.     y=xa;
  177.  
  178.     for(i=0;i<=itera;i++)
  179.     {
  180.       precalc=y-(x*x);
  181.       xx=x*cosinus-precalc*sinus;
  182.       y=x*sinus+precalc*cosinus;
  183.       x=xx;
  184.       WritePixel(my_window->RPort,(ULONG)((XSIZE*x)+370.0),(ULONG)(105-(SIZE*y)));
  185.     }
  186.  
  187.     my_message=(struct IntuiMessage *)GetMsg(my_window->UserPort);
  188.     if(my_message)
  189.     {
  190.       class=my_message->Class;
  191.       ReplyMsg((struct IntuiMassage *)my_message);
  192.       if(class==CLOSEWINDOW) close_me=TRUE;
  193.     }
  194.  
  195.     if(close_me==TRUE) break;
  196.   }
  197.  
  198.   /****** PRINT INFO ******/
  199.  
  200.   sprintf(buf,"A      : %lf",a);
  201.   PrintIText(my_window->RPort,&black_text,8,15);
  202.   sprintf(buf,"XYMin  : %lf",xymin);
  203.   PrintIText(my_window->RPort,&black_text,8,23);
  204.   sprintf(buf,"XYMax  : %lf",xymax);
  205.   PrintIText(my_window->RPort,&black_text,8,31);
  206.   sprintf(buf,"XYStep : %lf",xystep);
  207.   PrintIText(my_window->RPort,&black_text,8,39);
  208.   sprintf(buf,"Itera  : %ld",itera);
  209.   PrintIText(my_window->RPort,&black_text,8,47);
  210.  
  211.   /****** TERMINATE PROGRAM ******/
  212.  
  213.   while(close_me==FALSE)
  214.   {
  215.     Wait(1<<my_window->UserPort->mp_SigBit);
  216.     my_message=(struct IntuiMessage *)GetMsg(my_window->UserPort);
  217.     if(my_message)
  218.     {
  219.       class=my_message->Class;
  220.       ReplyMsg((struct IntuiMassage *)my_message);
  221.       if(class==CLOSEWINDOW)
  222.         close_me=TRUE;
  223.     }
  224.   }
  225.  
  226.   cleanexit();
  227. }
  228.  
  229. void cleanexit()
  230. {
  231.   if(my_window) CloseWindow(my_window);
  232.   if(my_screen) CloseScreen(my_screen);
  233.   if(GfxBase) CloseLibrary((struct Library *)GfxBase);
  234.   if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  235.   exit(0);
  236. }
  237.